<?php

namespace App\Utils;

use App\Exceptions\File\GetFileUrlFromQiniuWithErrorTypeException;
use App\Exceptions\File\GetFileUrlFromQiniuWithoutFileKeyException;
use App\Exceptions\File\GetFileUrlFromQiniuWithoutTypeException;
use App\Utils\FileManager;
use Qiniu\Auth;

/**
* 七牛文件管理类
*
* @throws 	GetFileUrlFromQiniuWithoutTypeException		获取文件url时缺少传入的类型参数（public/private）
* @throws	GetFileUrlFromQiniuWithErrorTypeException 	获取文件url时传入了错误的类型参数
* @throws	GetFileUrlFromQiniuWithoutFileKeyException 	系统为七牛指定的下载类型(private/public)
*/
class QiniuFileManager extends FileManager
{	
	const EXPIRES = 300;
	private $accessKey;
	private $secretKey;
	private $domain;
	private $auth;

	function __construct()
	{
		$this->accessKey = config('qiniu.accessKey');
		$this->secretKey = config('qiniu.secretKey');
		$this->bucket = config('qiniu.bucket');
		$this->domain = config('qiniu.domain');
		$this->auth = new Auth($this->accessKey, $this->secretKey);

		if($this->domain[count($this->domain) - 1] !== "/")
		{
			$this->domain = $this->domain . "/";
		}
	}

	/**
	 * 获取上传文件token
	 *
	 * @return 	upToken 	上传文件到七牛的凭证token
	 */
	public function getUploadToken()
	{
		$upToken = $this->auth->uploadToken($this->bucket);

		return $upToken;
	}

	/**
	 * 获取七牛公共文件的url
	 *
	 * @param 	fileKey 	文件在七牛上存储的key值（即文件名）
	 *
	 * @return 	fileUrl 	公共文件在七牛上的url
	 */
	private function getPublicFileUrl($fileKey)
	{
		$fileUrl =  $this->domain . $fileKey;

		return $fileUrl;
	}

	/**
	 * 获取七牛私有文件的url
	 *
	 * @param 	fileKey 	文件在七牛上存储的key值（即文件名）
	 *
	 * @return 	fileUrl 	私有文件在七牛上的url
	 */
	private function getPrivateFileUrl($fileKey)
	{
		$baseUrl = $this->domain . $fileKey;

		$fileUrl = $this->auth->privateDownloadUrl($baseUrl,self::EXPIRES);

		return $fileUrl;
	}

	/**
	 * 获取七牛文件的url
	 *
	 * @param 	fileKey 	文件在七牛上存储的key值（即文件名）
	 * 			type 		文件的类型（public/private） 	
	 *
	 * @return 	fileUrl 	文件在七牛上的url
	 */
	public function getFileUrl($fileKey = null, $type = null)
	{
		if(!isset($fileKey))
			throw new GetFileUrlFromQiniuWithoutFileKeyException();

		if(!isset($type))
			throw new GetFileUrlFromQiniuWithoutTypeException();

		$fileUrl = "";
		if($type === "public")
		{
			$fileUrl = $this->getPublicFileUrl($fileKey);
		}
		else if($type === "private")
		{
			$fileUrl = $this->getPrivateFileUrl($fileKey);
		}
		else 
		{
			throw new GetFileUrlFromQiniuWithErrorTypeException();
		}

		return $fileUrl;
	}

    /**
     * 根据key获取文件信息
     *
     * @param   $key    文件key值
     *
     */
    public function getFileStatus($key){

        $bucketManager = new BucketManager($this->auth);

        list($response, $error) = $bucketManager->stat($bucketManager, $key);

        if(is_null($error)){
        }

        return $response;
    }
}

